package main

import (
	"go-xorm-01/utils"
	"time"
	"xorm.io/xorm/names"
)

// 同步数据库结构 : https://xorm.io/zh/docs/chapter-03/4.sync/
// 同步能够部分智能的根据结构体的变动检测表结构的变动，并自动同步。目前有两个实现：
//
// Sync
// Sync和Sync2为同一个函数。Sync函数将进行如下的同步操作：
//
// * 自动检测和创建表，这个检测是根据表的名字
// * 自动检测和新增表中的字段，这个检测是根据字段名，同时对表中多余的字段给出警告信息
// * 自动检测，创建和删除索引和唯一索引，这个检测是根据索引的一个或多个字段名，而不根据索引名称。因此这里需要注意，如果在一个有大量数据的表中引入新的索引，数据库可能需要一定的时间来建立索引。
// * 自动转换varchar字段类型到text字段类型，自动警告其它字段类型在模型和数据库之间不一致的情况。
// * 自动警告字段的默认值，是否为空信息在模型和数据库之间不匹配的情况
//
// 以上这些警告信息需要将日志的显示级别调整为Warn级别才会显示。
func main() {
	SnakeMapper()
}

// SnakeMapper
//
//	@Description: SnakeMapper支持struct为驼峰式命名，表结构为下划线命名之间的转换，这个是默认的Mapper
func SnakeMapper() {
	engine := utils.GenerateEngine()
	engine.SetMapper(names.SnakeMapper{}) // SnakeMapper 【默认】
	// 自动同步结构体到数据库,见sql.sql
	engine.Sync2(new(UserSnake))

}

// UserSnake
// @Description: UserSnake
type UserSnake struct {
	Id            int64 `xorm:"id"` //指定列名 ，默认id
	Username      string
	Password      string
	RegisterTime  time.Time
	LastLoginTime time.Time
}

// TableName
//
//	@Description: 指定表名：默认为:user_snake
//	@receiver u
//	@return string
func (u UserSnake) TableName() string {
	return "user_snake"
}
